
#ifndef _DBG_ASSERT_H_H
#define _DBG_ASSERT_H_H

#ifdef __cplusplus
extern "C"
{
#endif

/*****************************************************************************
 * @brief   msg
 *****************************************************************************/
#define ASSERT_MSG_OUTPUT
	void assert_message_output(const char *file, int line, const char *message);
	void assert_value_msg_output(const char *file, int line, int value, const char *message);

#if DBG_EN > 0
#define dbg_msg_disp(msg) assert_message_output(__FILE__, __LINE__, msg)
#define dbg_msg_ext_disp(val, msg) assert_value_msg_output(__FILE__, __LINE__, val, msg)

/*****************************************************************************
 * @brief   assert message
 *****************************************************************************/
#define dbg_assert_bool(con, msg) \
	if (!(con))                   \
	{                             \
		dbg_msg_disp(msg);        \
	}

#define dbg_assert(con, msg) dbg_assert_bool(con, msg) // msg for assert fail
#define dbg_assert_null(ptr, msg) dbg_assert_bool(!(ptr), msg " :: " #ptr " is not null")
#define dbg_assert_not_null(ptr, msg) dbg_assert_bool(ptr, msg " :: " #ptr " is null")
#define dbg_assert_true(con, msg) dbg_assert_bool(con, msg " :: " #con " is not true")
#define dbg_assert_false(con, msg) dbg_assert_bool(!(con), msg " :: " #con " is not false")

#define dbg_assert_bit_1(var, pos, msg) dbg_assert_bool(get_bit(var, pos), msg " :: " #var "[:" #pos "] is not 1")
#define dbg_assert_bit_0(var, pos, msg) dbg_assert_bool(!get_bit(var, pos), msg " :: " #var "[:" #pos "] is not 0")

#define dbg_assert_zero(var, msg)                              \
	if (var)                                                   \
	{                                                          \
		dbg_msg_ext_disp(var, msg " :: " #var " is not zero"); \
	}

#define dbg_assert_rang(var, min, max, msg)                   \
	if (rang_check(var, min, max))                            \
	{                                                         \
		dbg_msg_ext_disp(var, msg " :: " #var " rang error"); \
	}

#define dbg_assert_rang_out(var, min, max, msg)               \
	if (!rang_check(var, min, max))                           \
	{                                                         \
		dbg_msg_ext_disp(var, msg " :: " #var " rang error"); \
	}

/*****************************************************************************
 * @brief   trace message
 *****************************************************************************/
#define dbg_trace_equ(var, val, msg)               \
	if (var == val)                                \
	{                                              \
		dbg_msg_disp(msg " :: " #var " == " #val); \
	}
#define dbg_trace_nequ(var, val, msg)                       \
	if (var != val)                                         \
	{                                                       \
		dbg_msg_ext_disp(var, msg " :: " #var " != " #val); \
	}
#define dbg_trace_true(con, msg)                  \
	if (con)                                      \
	{                                             \
		dbg_msg_disp(msg " :: " #con " is ture"); \
	}
#define dbg_trace_false(con, msg)                  \
	if (!(con))                                    \
	{                                              \
		dbg_msg_disp(msg " :: " #con " is false"); \
	}
#define dbg_trace_zero(var, msg)                  \
	if (!(var))                                   \
	{                                             \
		dbg_msg_disp(msg " :: " #var " is zero"); \
	}
#define dbg_trace_nzero(var, msg)                       \
	if (var != 0)                                       \
	{                                                   \
		dbg_msg_ext_disp(var, msg " :: " #var " != 0"); \
	}
#define dbg_trace_msg(msg) dbg_msg_disp(msg)

/*****************************************************************************
 * @brief    message
 *****************************************************************************/
#define dbg_msg_equ(var, val, msg)                         \
	if (var == val)                                        \
	{                                                      \
		dbg_puts("MSG:: " #var " == " #val ", " msg PTCR); \
	}
#define dbg_msg_nequ(var, val, msg)                                           \
	if (var != val)                                                           \
	{                                                                         \
		dbg_print("MSG:: " #var " != " #val ", " msg ", " #var ":%d\n", var); \
	}
#define dbg_msg_true(con, msg)                         \
	if (con)                                           \
	{                                                  \
		dbg_puts("MSG:: " #con " is ture, " msg PTCR); \
	}
#define dbg_msg_false(con, msg)                         \
	if (!(con))                                         \
	{                                                   \
		dbg_puts("MSG:: " #con " is false, " msg PTCR); \
	}
#define dbg_msg_zero(var, msg)                         \
	if (!(var))                                        \
	{                                                  \
		dbg_puts("MSG:: " #var " is zero, " msg PTCR); \
	}
#define dbg_msg_nzero(var, msg)                                        \
	if (var != 0)                                                      \
	{                                                                  \
		dbg_print("MSG:: " #var " != 0, " msg ", " #var ":%d\n", var); \
	}

#else
#define dbg_msg_disp(...)
#define dbg_msg_ext_disp(...)
#define dbg_assert(...)
#define dbg_assert_null(...)
#define dbg_assert_not_null(...)
#define dbg_assert_true(...)
#define dbg_assert_false(...)
#define dbg_assert_bit_1(...)
#define dbg_assert_bit_0(...)
#define dbg_assert_zero(...)
#define dbg_assert_rang(...)
#define dbg_assert_nrang(...)

#define dbg_trace_equ(...)
#define dbg_trace_nequ(...)
#define dbg_trace_true(...)
#define dbg_trace_false(...)
#define dbg_trace_zero(...)
#define dbg_trace_nzero(...)
#define dbg_trace_msg(...)

#define dbg_msg_equ(...)
#define dbg_msg_nequ(...)
#define dbg_msg_true(...)
#define dbg_msg_false(...)
#define dbg_msg_zero(...)
#define dbg_msg_nzero(...)

#endif

#ifdef __cplusplus
}
#endif

#endif /* _DBG_ASSERT_H_H */
